import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:path/path.dart' as path;
import 'package:uuid/uuid.dart';
import 'logger.dart';

/// 文件工具类
class FileUtils {
  static final _logger = Logger('FileUtils');
  static const _uuid = Uuid();

  /// 选择多个文件
  static Future<List<File>> pickFiles({
    List<String>? allowedExtensions,
    FileType type = FileType.any,
  }) async {
    try {
      final result = await FilePicker.platform.pickFiles(
        allowMultiple: true,
        type: type,
        allowedExtensions: allowedExtensions,
      );

      if (result == null || result.files.isEmpty) {
        return [];
      }

      return result.files
          .where((file) => file.path != null)
          .map((file) => File(file.path!))
          .toList();
    } catch (e) {
      _logger.error('选择文件失败: $e');
      return [];
    }
  }

  /// 选择一个文件
  static Future<File?> pickFile({
    List<String>? allowedExtensions,
    FileType type = FileType.any,
  }) async {
    try {
      final result = await FilePicker.platform.pickFiles(
        type: type,
        allowedExtensions: allowedExtensions,
      );

      if (result == null ||
          result.files.isEmpty ||
          result.files.first.path == null) {
        return null;
      }

      return File(result.files.first.path!);
    } catch (e) {
      _logger.error('选择文件失败: $e');
      return null;
    }
  }

  /// 选择一个文件夹
  static Future<String?> pickDirectory() async {
    try {
      final result = await FilePicker.platform.getDirectoryPath();
      return result;
    } catch (e) {
      _logger.error('选择文件夹失败: $e');
      return null;
    }
  }

  /// 获取文件大小（字节）
  static Future<int> getFileSize(File file) async {
    try {
      return await file.length();
    } catch (e) {
      _logger.error('获取文件大小失败: $e');
      return 0;
    }
  }

  /// 获取文件扩展名
  static String getFileExtension(String filePath) {
    return path.extension(filePath).toLowerCase();
  }

  /// 生成唯一文件名
  static String generateUniqueFileName(String originalFileName) {
    final extension = getFileExtension(originalFileName);
    final nameWithoutExtension = path.basenameWithoutExtension(
      originalFileName,
    );
    final uniqueId = _uuid.v4().substring(0, 8);
    return '${nameWithoutExtension}_$uniqueId$extension';
  }

  /// 获取文件类型
  static String getFileType(String filePath) {
    final extension = getFileExtension(filePath);

    // 图片文件
    if ([
      '.jpg',
      '.jpeg',
      '.png',
      '.gif',
      '.bmp',
      '.webp',
    ].contains(extension)) {
      return 'photo';
    }

    // 视频文件
    if ([
      '.mp4',
      '.avi',
      '.mov',
      '.flv',
      '.wmv',
      '.mkv',
      '.webm',
    ].contains(extension)) {
      return 'video';
    }

    // 音频文件
    if (['.mp3', '.wav', '.ogg', '.aac', '.flac', '.m4a'].contains(extension)) {
      return 'audio';
    }

    // 文档文件
    if ([
      '.pdf',
      '.doc',
      '.docx',
      '.xls',
      '.xlsx',
      '.ppt',
      '.pptx',
      '.txt',
    ].contains(extension)) {
      return 'document';
    }

    // 其他文件
    return 'other';
  }
}
